package com.myapp.db.entity;

import java.nio.ByteBuffer;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.concurrent.atomic.*;

import com.myapp.data.define.BaseBean;
import com.myapp.db.config.ann.TableDefine;
import com.myapp.db.config.define.UpdateData;
import com.myapp.db.dao.manual.BagDao;

/**
 * 文件名：BagEntity.java
 * <p>
 * 功能：
 * <p>
 * 作者：Builded by AppTools.
 */
@TableDefine(name = "Bag", dao = BagDao.class)
public class BagEntity extends BaseBean {
	// 用户id
	private AtomicLong userid = new AtomicLong(0);
	
	// 物品code
	private AtomicInteger code = new AtomicInteger(0);
	
	// 个数
	private AtomicInteger num = new AtomicInteger(0);
	
	// 上次获得时间
	private AtomicInteger time = new AtomicInteger(0);
	
	// 此条记录最后修改时间
	private AtomicLong updatetime = new AtomicLong(0);
	

	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public long getUserid() {
		return this.userid.get();
	}

	/**
	 * 原子增加用户id
	 * 
	 * @param userid 要加的值（正数）
	 */
	public void addUserid(long userid) {
		UpdateData data = new UpdateData(this.userid.get(), userid);
		this.getOldData().put("userid", data);
		this.userid.addAndGet(userid);
	}

	/**
	 * 原子减少用户id
	 * 
	 * @param userid 要减的值（正数）
	 */
	public void minusUserid(long userid) {
		UpdateData data = new UpdateData(this.userid.get(), userid);
		this.getOldData().put("userid", data);
		this.userid.addAndGet(userid*-1);
	}
	
	/**
	 * 直接设置userid的值
	 * 
	 * @param userid 要设置的新值
	 */
	public void setUserid(long userid){
		UpdateData data = new UpdateData(this.userid.get(), userid);
		this.getOldData().put("userid", data);
		this.userid.set(userid);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public int getCode() {
		return code.get();
	}

	/**
	 * 原子增加物品code
	 * 
	 * @param code 要加的值（正数）
	 */
	public void addCode(int code) {
		UpdateData data = new UpdateData(this.code.get(), code);
		this.getOldData().put("code", data);
		this.code.addAndGet(code);
	}
	
	/**
	 * 原子减少物品code
	 * 
	 * @param code 要减的值（正数）
	 */
	public void minusCode(int code) {
		UpdateData data = new UpdateData(this.code.get(), code);
		this.getOldData().put("code", data);
		this.code.addAndGet(code*-1);
	}
	
	/**
	 * 直接设置code的值
	 * 
	 * @param code 要设置的新值
	 */
	public void setCode(int code){
		UpdateData data = new UpdateData(this.code.get(), code);
		this.getOldData().put("code", data);
		this.code.set(code);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public int getNum() {
		return num.get();
	}

	/**
	 * 原子增加个数
	 * 
	 * @param num 要加的值（正数）
	 */
	public void addNum(int num) {
		UpdateData data = new UpdateData(this.num.get(), num);
		this.getOldData().put("num", data);
		this.num.addAndGet(num);
	}
	
	/**
	 * 原子减少个数
	 * 
	 * @param num 要减的值（正数）
	 */
	public void minusNum(int num) {
		UpdateData data = new UpdateData(this.num.get(), num);
		this.getOldData().put("num", data);
		this.num.addAndGet(num*-1);
	}
	
	/**
	 * 直接设置num的值
	 * 
	 * @param num 要设置的新值
	 */
	public void setNum(int num){
		UpdateData data = new UpdateData(this.num.get(), num);
		this.getOldData().put("num", data);
		this.num.set(num);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public int getTime() {
		return time.get();
	}

	/**
	 * 原子增加上次获得时间
	 * 
	 * @param time 要加的值（正数）
	 */
	public void addTime(int time) {
		UpdateData data = new UpdateData(this.time.get(), time);
		this.getOldData().put("time", data);
		this.time.addAndGet(time);
	}
	
	/**
	 * 原子减少上次获得时间
	 * 
	 * @param time 要减的值（正数）
	 */
	public void minusTime(int time) {
		UpdateData data = new UpdateData(this.time.get(), time);
		this.getOldData().put("time", data);
		this.time.addAndGet(time*-1);
	}
	
	/**
	 * 直接设置time的值
	 * 
	 * @param time 要设置的新值
	 */
	public void setTime(int time){
		UpdateData data = new UpdateData(this.time.get(), time);
		this.getOldData().put("time", data);
		this.time.set(time);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public long getUpdatetime() {
		return this.updatetime.get();
	}

	/**
	 * 原子增加此条记录最后修改时间
	 * 
	 * @param updatetime 要加的值（正数）
	 */
	public void addUpdatetime(long updatetime) {
		UpdateData data = new UpdateData(this.updatetime.get(), updatetime);
		this.getOldData().put("updatetime", data);
		this.updatetime.addAndGet(updatetime);
	}

	/**
	 * 原子减少此条记录最后修改时间
	 * 
	 * @param updatetime 要减的值（正数）
	 */
	public void minusUpdatetime(long updatetime) {
		UpdateData data = new UpdateData(this.updatetime.get(), updatetime);
		this.getOldData().put("updatetime", data);
		this.updatetime.addAndGet(updatetime*-1);
	}
	
	/**
	 * 直接设置updatetime的值
	 * 
	 * @param updatetime 要设置的新值
	 */
	public void setUpdatetime(long updatetime){
		UpdateData data = new UpdateData(this.updatetime.get(), updatetime);
		this.getOldData().put("updatetime", data);
		this.updatetime.set(updatetime);
	}
	

	@Override
	public void parseEntity(ResultSet rest) throws SQLException {
		// id
		this.setId(rest.getLong(1));
		// 用户id
		this.userid.set(rest.getLong(2));
		// 物品code
		this.code.set(rest.getInt(3));
		// 个数
		this.num.set(rest.getInt(4));
		// 上次获得时间
		this.time.set(rest.getInt(5));
		// 此条记录最后修改时间
		this.updatetime.set(rest.getLong(6));
	}
	
	
	/**
	 * 将本对象变化的数据序列化
	 * 
	 * @return 返回序列化后的数据
	 */
	@Override
	public byte[] serialization() {
	ByteBuffer data = ByteBuffer.allocate(1024);
		if (this.getOldData().containsKey("userid")) {
			data = this.checkCapacity(data, 8);
			data.put((byte) 0);
			data.putLong(userid.get());
		}
		if (this.getOldData().containsKey("code")) {
			data = this.checkCapacity(data, 4);
			data.put((byte) 1);
			data.putInt(code.get());
		}
		if (this.getOldData().containsKey("num")) {
			data = this.checkCapacity(data, 4);
			data.put((byte) 2);
			data.putInt(num.get());
		}
		if (this.getOldData().containsKey("time")) {
			data = this.checkCapacity(data, 4);
			data.put((byte) 3);
			data.putInt(time.get());
		}
		if (this.getOldData().containsKey("updatetime")) {
			data = this.checkCapacity(data, 8);
			data.put((byte) 4);
			data.putLong(updatetime.get());
		}
		data.flip();
		return data.array();
	}
	
	
	/**
	 * 反序列化
	 * 
	 * @param data 要反序列化的数据
	 * 
	 * @return 返回序列化出来的对象
	 */
	@SuppressWarnings("unchecked")
	@Override
	public BagEntity unSerialization(byte[] data) {
		BagEntity bagEntity = new BagEntity();
		if (data.length > 0) {

			ByteBuffer buffer = ByteBuffer.wrap(data);
			buffer.flip();

			byte type = 0;
			while (buffer.position() < buffer.limit()) {
				type = buffer.get();
			if (type ==  0) {
				this.setUserid(buffer.getLong());
			}
			
			if (type ==  1) {
				this.setCode(buffer.getInt());
			}
			
			if (type ==  2) {
				this.setNum(buffer.getInt());
			}
			
			if (type ==  3) {
				this.setTime(buffer.getInt());
			}
			
			if (type ==  4) {
				this.setUpdatetime(buffer.getLong());
			}
			
			}
		}

		return bagEntity;
	}
}
